昨天我們處理完 Central 要做的工作了,今天就換來處理 Peripheral 吧。
上面提到將裝置的處理代理給這個檔案之後,剩下的就是 Peripheral 的工作了。
Peripheral 的工作包含發現裝置服務、發現服務特徵碼、監聽服務及特徵碼值等。
首先是發現服務,每個裝置都有內建的服務,裡面裝著不同的特徵碼,這裡先需要發現連接裝置下的所有服務之後才能去發現對應的特徵碼。
在上面連接裝置的最後,除了將 Peripheral 指定給檔案本身之外,同時也開始去發現這個裝置的服務。
那發現服務之後,需要 CBPeripheralDelegate 來處理發現服務之後要做的事情,首先還是一樣,先 extension CBPeripheralDelegate,然後調用這個函式。
這個函式主要是在發現一個服務時會去執行,在下面程式裡,發現服務之後會馬上去發現服務裡所有對應的特徵碼。
extension BluetoothServices: CBPeripheralDelegate {
func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
if let services = peripheral.services {
for service in services {
print(service)
peripheral.discoverCharacteristics(nil, for: service)
}
}
}
}
在這裡先暫停一下,雖然大部分時候,藍牙裝置內部的服務通常是不會動到的,但是難保有時候會去對裝置裡的服務去做更改,這裡就需要這個函式。
這個函式會在發現服務內容有更改的時候執行。
func peripheral(_ peripheral: CBPeripheral, didModifyServices invalidatedServices: [CBService]) {
}
那回歸正題,發現服務之後,會取發現服務下的特徵碼,當他發先特徵碼的時候會去調用下面這個函式,在這個函式裡也能對特徵碼去做一些處理。
例如說:這裡在發現當有特徵碼的 UUID 是 "FFE1" 的時候,會去讀取這個裝置的這個 UUID 的特徵碼的值。
func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
if let characteristics = service.characteristics {
for characteristic in characteristics {
print(characteristic)
if characteristic.uuid.isEqual(CBUUID(string: "FFE1")) {
peripheral.readValue(for: characteristic)
}
}
}
}
接下來,藍牙裝置的特徵碼的值不一定會保持不變,可以調用下面的程式去監聽對應的裝置裡某個特徵值的變化,當值有變化時就會去執行你在裡面進行的工作。
func peripheral(_ peripheral: CBPeripheral,
didUpdateValueFor characteristic: CBCharacteristic,
error: Error?) {
}
最後是寫值的部分,寫值其實意外的簡單,只需要下面這行就能將值寫進特徵值裡。
peripheral.writeValue(Data, for: CBCharacteristic, type: CBCharacteristicWriteType)